#include "app_device.h"

struct app_device
{

    bool is_running;
    // 上行缓冲区
    buffer_t *upbuffer;
    // 下行缓冲区
    buffer_t *downbuffer;
};
void UpTask(void *);
void DownTask(void *);

app_device_t *dev;
void Mqtt_CallBack(char *data, int len);

app_device_t *App_Device_Init(void)
{
    // 判断是否已经存在设备
    if (dev)
    {
        return dev;
    }
    // 给设备分配空间
    dev = (app_device_t *)malloc(sizeof(app_device_t));
    // 初始化mqtt
    if (App_Mqtt_Init(Mqtt_CallBack) != GATE_OK)
    {
        // mqtt初始化失败
        log_info("mqtt初始化失败");
        free(dev);
        return NULL;
    }
    // 初始化上行和下行缓冲区
    dev->upbuffer = App_Buffer_Init(1024);
    dev->downbuffer = App_Buffer_Init(1024);
    // 初始化线程池
    if (App_Pool_Init(10) != GATE_OK)
    {
        // 初始化线程池失败
        log_info("初始化线程池失败");
        free(dev);
        App_Mqtt_Deinit();
        App_Buffer_Deinit(dev->downbuffer);
        App_Buffer_Deinit(dev->upbuffer);
        return NULL;
    }
    // 初始化modbus模块
    App_Modbus_Init();
    // 向线程池中添加上行和下行任务
    App_Pool_AddFun2Task(UpTask, NULL);
    log_info("上行任务启动完成");
    App_Pool_AddFun2Task(DownTask, NULL);
    log_info("下行任务启动完成");
    dev->is_running=true;

    return dev;
}

void App_Device_Deinit(app_device_t *dev)
{
    App_Mqtt_Deinit();
    App_Buffer_Deinit(dev->downbuffer);
    App_Buffer_Deinit(dev->upbuffer);
    App_Pool_Deinit();
    // modebus反初始化

    free(dev);
}
// 读取上行缓冲区的数据将其推送到mqtt主题
void UpTask(void *args)
{
    char data[256];
    while (1)
    {
        int len = App_Buffer_Read(dev->upbuffer, data, sizeof(data));
        if (len > 0)
        {
            data[len] = '\0';
            App_Mqtt_PublishMessage(data, len);
            log_info("publish....");
        }
    }
}
// 将mqtt发送来的数据 转换为字符串 通过modbus与电机通讯
void DownTask(void *args)
{
    char data[256];
    while (1)
    {
        int data_len = App_Buffer_Read(dev->downbuffer, data, sizeof(data));
        if (data_len <= 0)
            continue;
        // 收到mqtt发来的消息
        // 解析mqtt消息
        msg_t msg;
        App_Msg_Json2Char(&msg, data);
        log_info("action: %s, connType: %s, motorId: %d, motorSpeed: %d, status: %s", msg.action, msg.connType, msg.motorId, msg.motorSpeed, msg.status);
        // 将解析完的数据通过modbus发送给电机
        if (strcmp(msg.action, "set") == 0)
        {
            // 调用modbus模块的写保持寄存器的函数  TODO
            // log_info("modbus_write_register");
            App_Modbus_WriteHodeRegister(msg.motorId, (uint16_t)msg.motorSpeed);
        }
        else if (strcmp(msg.action, "get") == 0)
        {
           
            // 模拟读取到的数据发送到上行缓冲区
            // msg.motorSpeed=300;
            // msg.status="ok";
            if (App_Modbus_ReadInputRegister(msg.motorId, &msg.motorSpeed) == GATE_ERROR)
            {
                msg.status = "error";
            }
            else
            {
                msg.status = "ok";
            }

            char json[256];
            memset(json, 0, sizeof(json));
            App_Msg_Char2Json(&msg, json);
            // 上传数据
            App_Buffer_Write(dev->upbuffer, json, strlen(json));
        }
    }
}
// 将从服务器收到的消息发送到下行缓冲区
void Mqtt_CallBack(char *data, int len)
{
    if (len < 0 || data == NULL)
    {
        log_info("接收到的数据有误");
        return;
    }
    log_info("接收到的数据为：%.*s", len, data);
    App_Buffer_Write(dev->downbuffer, data, (char)len);
}
bool App_Device_GetIsRunning(void){
    // dev->is_running=true;
    return dev->is_running;
}
void App_Device_SetIsrunning(bool is_running){
    dev->is_running=is_running;
}
